@hraness/wordcell 0.21.2 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +196 -66
  2. package/dist/{authority-4sp9d552.js → authority-1pgftmwq.js} +55 -10
  3. package/dist/benchmark.js +3 -3
  4. package/dist/capture.js +6 -5
  5. package/dist/cli.js +61 -3800
  6. package/dist/clip/acquire.js +3 -2
  7. package/dist/clip/cli.js +6 -5
  8. package/dist/clip/doctor.js +4 -3
  9. package/dist/clip/jobs.js +3 -3
  10. package/dist/clip/refresh.js +1 -1
  11. package/dist/evaluation-builder.js +18 -17
  12. package/dist/evaluation-kb.js +14 -13
  13. package/dist/graph-authority.js +3 -3
  14. package/dist/graph-percolation.js +5 -5
  15. package/dist/index-0dqfnrz9.js +1985 -0
  16. package/dist/{index-0k2x4nn9.js → index-1tm7bgx7.js} +16 -4
  17. package/dist/{index-vdw5yjfa.js → index-2hf27mws.js} +108 -18
  18. package/dist/index-3agn8scn.js +306 -0
  19. package/dist/index-4ag64rc1.js +4299 -0
  20. package/dist/index-4knsp9qj.js +34 -0
  21. package/dist/index-66pshdtx.js +341 -0
  22. package/dist/index-9rf81m0p.js +368 -0
  23. package/dist/{index-59ssmqqm.js → index-a6kbv718.js} +1 -1
  24. package/dist/{index-51bap0mq.js → index-avbce90h.js} +9 -9
  25. package/dist/{index-180zbkkt.js → index-de2w8crk.js} +14 -13
  26. package/dist/{index-pbr6rv47.js → index-e6p9e926.js} +6 -6
  27. package/dist/{index-bcfn9xah.js → index-famy7fhs.js} +5 -5
  28. package/dist/{index-by0pbant.js → index-fc4dr114.js} +5 -2
  29. package/dist/{index-x6m57nfc.js → index-g5vsqmdy.js} +28 -57
  30. package/dist/{index-115b07ap.js → index-hcw140eb.js} +5 -5
  31. package/dist/index-j70m75wd.js +217 -0
  32. package/dist/{index-3ehtt59c.js → index-qwgsmtsz.js} +1 -1
  33. package/dist/{index-bgfzwt4h.js → index-t2bs9xdr.js} +4 -4
  34. package/dist/index.js +285 -93
  35. package/dist/portfolio.js +14 -13
  36. package/dist/publish-model.js +36 -0
  37. package/dist/publish-reader/reader.css +1042 -0
  38. package/dist/publish-reader/reader.js +1534 -0
  39. package/dist/publish-reader/theme.js +92 -0
  40. package/dist/publish-search.js +52 -0
  41. package/dist/publish.js +36 -0
  42. package/dist/rerank-typesafe.js +13 -0
  43. package/dist/rerank.js +14 -0
  44. package/dist/sdk.js +14 -11
  45. package/dist/search.js +2 -2
  46. package/dist/semantic.js +4 -4
  47. package/dist/support-mywv1em0.js +140 -0
  48. package/dist/workflows/decision-context.js +13 -12
  49. package/dist/workflows/index.js +13 -12
  50. package/package.json +68 -7
  51. package/skills/wordcell/AGENTS.md +1 -0
  52. package/skills/wordcell/SKILL.md +21 -1
  53. package/skills/wordcell/agents/openai.yaml +1 -1
  54. package/skills/wordcell/references/publish.md +93 -0
  55. package/skills/wordcell/references/query.md +22 -0
  56. package/src/cli-program.ts +353 -9
  57. package/src/cli.ts +12 -1
  58. package/src/clip/acquire.ts +2 -0
  59. package/src/clip/doctor.ts +2 -0
  60. package/src/clip/media.ts +2 -0
  61. package/src/index.ts +4 -0
  62. package/src/oh/authority.ts +14 -5
  63. package/src/oh/canonical-rust.ts +127 -0
  64. package/src/oh/projection-rust.ts +63 -0
  65. package/src/oh-adoption.ts +7 -1
  66. package/src/publish-graph.ts +0 -0
  67. package/src/publish-index.ts +195 -0
  68. package/src/publish-markdown.ts +617 -0
  69. package/src/publish-model.ts +599 -0
  70. package/src/publish-nav.ts +204 -0
  71. package/src/publish-pages.ts +382 -0
  72. package/src/publish-reader/reader.css +1042 -0
  73. package/src/publish-reader/reader.ts +1017 -0
  74. package/src/publish-reader/theme.ts +97 -0
  75. package/src/publish-search.ts +418 -0
  76. package/src/publish-select.ts +419 -0
  77. package/src/publish-theme.ts +106 -0
  78. package/src/publish.ts +904 -0
  79. package/src/rerank-credentials.ts +56 -0
  80. package/src/rerank-typesafe.ts +472 -0
  81. package/src/rerank.ts +389 -0
  82. package/src/sdk.ts +157 -6
  83. package/src/serve.ts +180 -0
  84. package/src/support-profile.ts +7 -0
  85. package/src/support.ts +73 -0
  86. package/src/vault.ts +23 -9
  87. package/dist/{index-why54q5p.js → index-gm9t95d9.js} +3 -3
package/README.md CHANGED
@@ -3,116 +3,156 @@
3
3
 
4
4
  [![Agent Skill](https://raw.githubusercontent.com/hraness/wordcell/main/assets/agent-skill.svg)](https://github.com/hraness/wordcell/tree/main/skills/wordcell)
5
5
 
6
- A knowledge base for coding agents, built from Markdown, backlinks, semantic
7
- search, and Git context.
8
- It turns sources, plans, and decisions into inspectable context that agents can
9
- recover across sessions without coupling application code to the knowledge
10
- system.
6
+ A local knowledge base for coding agents. Save decisions in Markdown and recover
7
+ the context behind your code. Give the next session only the context it needs.
11
8
 
12
- [Documentation](https://wordcell.io/docs) · [npm package](https://www.npmjs.com/package/@hraness/wordcell) · [Graph guide](https://github.com/hraness/wordcell/blob/main/docs/graph-authority.md) · [Changelog](https://github.com/hraness/wordcell/blob/main/CHANGELOG.md)
9
+ Your files stay yours: read them in Obsidian or any editor, review changes in
10
+ Git, and rebuild every index from the Markdown. Exact search and graph queries
11
+ run on your machine with no account or model. Web capture, hosted agents, and
12
+ optional remote reranking have [separate privacy boundaries](#privacy-and-boundaries).
13
+
14
+ [Documentation](https://wordcell.io/docs) · [Comparisons](https://github.com/hraness/wordcell/blob/main/docs/comparisons.md) · [Measured evidence](https://github.com/hraness/wordcell/blob/main/docs/evidence.md) · [Changelog](https://github.com/hraness/wordcell/blob/main/CHANGELOG.md)
15
+
16
+ ## Why Wordcell
17
+
18
+ - **Keep decisions with the work.** Link a plan to the notes that explain it,
19
+ attach those notes to a code path, and recover their Git history on request.
20
+ Only context you save becomes part of the record.
21
+ - **Read what matters.** Start with a code path, search result, or linked note.
22
+ Get a limited set of summaries and open the sources you need, instead of
23
+ loading the whole vault into an agent conversation.
24
+ - **Keep control of your knowledge.** Markdown and Git are the source of truth.
25
+ Use local search, export selected notes as a static site, and keep using the
26
+ files even without Wordcell.
27
+
28
+ Plain Markdown may be enough for a small set of notes. QMD is a good fit for
29
+ local document retrieval and also supplies Wordcell's optional semantic search.
30
+ Wordcell adds a connected workflow for repository context, authored relationships,
31
+ Git evidence, and selective publishing. [Compare the tradeoffs](https://github.com/hraness/wordcell/blob/main/docs/comparisons.md).
13
32
 
14
33
  ## Install
15
34
 
16
35
  [Bun 1.3.14 or newer](https://bun.sh/docs/installation) and Git are required.
17
- The CLI and TypeScript SDK run with Bun. Choose one installation source:
36
+ The CLI and TypeScript SDK run with Bun. Install the versioned GitHub archive:
18
37
 
19
38
  ```sh
20
- # Canonical, versioned GitHub archive
21
- bun add --global --ignore-scripts https://github.com/hraness/wordcell/releases/download/v0.21.2/hraness-wordcell-0.21.2.tgz
39
+ bun add --global --ignore-scripts https://github.com/hraness/wordcell/releases/download/v0.22.0/hraness-wordcell-0.22.0.tgz
22
40
  wordcell --help
23
41
  ```
24
42
 
25
- The same release is mirrored to [npm](https://www.npmjs.com/package/@hraness/wordcell):
43
+ Prefer npm? The same release is [mirrored there](https://www.npmjs.com/package/@hraness/wordcell):
26
44
 
27
45
  ```sh
28
- npm install --global --ignore-scripts @hraness/wordcell@0.21.2
46
+ npm install --global --ignore-scripts @hraness/wordcell@0.22.0
29
47
  wordcell --help
30
48
  ```
31
49
 
32
- Bun must remain in `PATH` when npm installs the commands. Exact search and
33
- Markdown graph commands need no account, service, or embedding model. Optional
34
- semantic search, browser capture, and PDF tools have [additional prerequisites](https://github.com/hraness/wordcell/blob/main/docs/reference.md#review-lifecycle-scripts-before-enabling-optional-adapters).
50
+ Keep Bun in `PATH` for either installation. If your shell cannot find `wordcell`,
51
+ add your package manager's global executable directory to `PATH` and reopen the
52
+ terminal. Optional semantic search, browser capture, and PDF tools have
53
+ [additional prerequisites](https://github.com/hraness/wordcell/blob/main/docs/reference.md#review-lifecycle-scripts-before-enabling-optional-adapters).
54
+
55
+ ## Keep one decision available to the next session
56
+
57
+ Run this from a directory where you want a new `kb/` folder. It creates one
58
+ Markdown note and finds it without downloading a model or contacting a service:
59
+
60
+ ```sh
61
+ wordcell init kb
62
+ wordcell note create notes/parser-contract \
63
+ --title "Parser contract" --type concept --tag architecture \
64
+ --body "Parser retries stop after three attempts." --root kb
65
+ wordcell search "parser retries" --root kb --mode exact
66
+ ```
67
+
68
+ The result includes `notes/parser-contract` and the saved retry constraint.
69
+ Open `kb/notes/parser-contract.md` to see the ordinary Markdown file. Wordcell
70
+ adds a stable `document_id` in its frontmatter; you can edit the prose normally.
71
+
72
+ Already have Markdown or an Obsidian vault? In **v0.22.0 or newer**, search
73
+ the existing folder without initialization or an `index.md` file:
74
+
75
+ ```sh
76
+ wordcell search "a phrase from your notes" --root /path/to/your/vault --mode exact
77
+ ```
78
+
79
+ Replace the path and phrase with your own. You don't need to initialize,
80
+ convert, or move the existing files to search them.
35
81
 
36
82
  ### Use with a coding agent
37
83
 
38
- Install the single public Agent Skill into your choice of compatible agent,
39
- including Claude Code, Codex, Cursor, or GitHub Copilot:
84
+ After trying the CLI, install the public Agent Skill into a compatible agent,
85
+ such as Claude Code, Codex, Cursor, or GitHub Copilot:
40
86
 
41
87
  ```sh
42
- bunx skills add hraness/wordcell#v0.21.2 --skill wordcell
88
+ bunx skills add hraness/wordcell#v0.22.0 --skill wordcell
43
89
  ```
44
90
 
45
91
  Then ask:
46
92
 
47
93
  ```text
48
- Use Wordcell to find the notes and plans about packages/parser in ./kb.
49
- Open the sources behind the result and explain the recorded decision.
94
+ Use Wordcell to search for "parser retries" in ./kb using exact mode.
95
+ Read the matching note and explain the saved constraint.
50
96
  ```
51
97
 
52
- The skill installs instructions, not a running service. It uses an existing
53
- `wordcell` command and prepares the pinned runtime only when needed. Installing
54
- it does not create a vault or modify your notes. [Read the skill](https://github.com/hraness/wordcell/blob/main/skills/wordcell/SKILL.md).
98
+ The skill installs instructions, not a service. Installation does not create a
99
+ vault, modify your notes, or grant an agent permission to access other accounts.
100
+ The agent still follows its own provider and data-handling settings.
101
+ [Inspect the skill](https://github.com/hraness/wordcell/blob/main/skills/wordcell/SKILL.md).
55
102
 
56
- ## Keep one decision available to the next session
103
+ ## Recover the stopped session
57
104
 
58
- Suppose a parser must stop retrying after three attempts. Record that constraint
59
- in a note, then link the plan that will implement it:
105
+ Link a plan to the decision you saved:
60
106
 
61
- ```shell
62
- wordcell init kb
63
- wordcell note create notes/parser-contract \
64
- --title "Parser contract" --type concept --tag architecture \
65
- --body "Parser retries stop after three attempts." --root kb
107
+ ```sh
66
108
  wordcell note create plans/parser-v2 \
67
109
  --title "Parser v2" --type plan \
68
110
  --body "The plan implements [[notes/parser-contract|the parser contract]]." \
69
111
  --root kb
112
+ wordcell backlinks notes/parser-contract --root kb
70
113
  ```
71
114
 
72
- The first `wordcell note create` command stores ordinary Markdown at
73
- `kb/notes/parser-contract.md` and assigns its stable `document_id`. Add the
74
- exact code boundary to that note's frontmatter so path lookup can recover it:
115
+ The backlink result includes `plans/parser-v2`, so a later session can find the
116
+ work that depends on the constraint.
117
+
118
+ For code-path lookup, add this field inside the existing frontmatter of
119
+ `kb/notes/parser-contract.md`:
75
120
 
76
121
  ```yaml
77
122
  repository_scopes:
78
123
  - packages/parser
79
124
  ```
80
125
 
81
- Commit the vault with the repository. The Markdown and its Git history are the
82
- durable record.
83
-
84
- ## Recover the stopped session
85
-
86
- In a later session, start from the code path and inspect each independent
87
- signal:
126
+ From your repository root, use an actual path under that scope and inspect the
127
+ returned notes and inherited `AGENTS.md` guides:
88
128
 
89
- ```shell
129
+ ```sh
90
130
  wordcell context packages/parser/src/index.ts --root kb --repo .
91
- wordcell search "why parser retries stop" --root kb --mode exact \
92
- --history --repo .
93
- wordcell backlinks notes/parser-contract --root kb
94
- wordcell history notes/parser-contract --root kb --repo .
95
131
  ```
96
132
 
97
- | Signal | What it recovers |
98
- | --- | --- |
99
- | Markdown | The current parser constraint in the file you can review and edit. |
100
- | Backlinks | The plan that explicitly links to the constraint. |
101
- | Exact search | The current note matched from its words, without a network request or embedding model. |
102
- | Repository context | Inherited `AGENTS.md` guides and records scoped to `packages/parser`. |
103
- | Git history | The commits and bounded co-change evidence associated with the note. |
104
-
105
- Together, those views recover the persisted decision, related plan, applicable
106
- rules, and provenance needed to resume the work. They do not reconstruct
107
- private chat or prove that the note is still correct. Open the returned
108
- Markdown and guides before acting on them.
133
+ Commit the vault with your repository to preserve its history, then use
134
+ `wordcell history notes/parser-contract --root kb --repo .` to inspect the
135
+ commits behind the note. History is optional and requires recorded Git commits.
109
136
 
110
- The boundaries stay visible: Markdown and Git are authoritative, backlinks and
111
- indexes are replaceable views, and Git work is opt-in. Application code imports
112
- neither the vault nor a hosted knowledge service.
137
+ These views recover saved decisions, related work, rules, and provenance.
138
+ They do not reconstruct private chat or prove that the note is still correct.
139
+ Open the returned Markdown and guides before acting on them.
113
140
 
114
141
  <!-- hraness:wordcell-landing:end -->
115
142
 
143
+ ## Rerank a search window
144
+
145
+ ```sh
146
+ wordcell search "why releases use immutable archives" --root kb --mode exact \
147
+ --rerank typesafe --rerank-limit 25 --limit 5 --json
148
+ ```
149
+
150
+ This optional hosted lane uses TypeSafe's pinned `jev-1.13.0` model. It sends
151
+ bounded query and note snippets to the provider, needs a private local
152
+ credential, and incurs provider charges. Exact identities remain first; a
153
+ provider failure retains the baseline order with a diagnostic. See the
154
+ [setup, SDK examples, measured results, and limits](https://github.com/hraness/wordcell/blob/main/docs/reranking.md).
155
+
116
156
  ## What you can do
117
157
 
118
158
  | Task | Command | Evidence and effects |
@@ -125,10 +165,71 @@ neither the vault nor a hosted knowledge service.
125
165
  | Capture a source | `wordcell clip https://example.com/article --output kb/articles` | Reads the selected URL and writes a Markdown bundle with a capture receipt. |
126
166
  | Capture a PDF | `wordcell pdf /absolute/path/to/document.pdf --output kb/articles` | Preserves the original PDF and extracted evidence; Poppler is required. |
127
167
  | Check the vault | `wordcell check --root kb` | Reports structural and attachment problems without editing files. |
168
+ | Publish selected notes | `wordcell publish --root kb --out site/ --include notes/parser-contract --dry-run --json` | Previews a static site selection locally; remove `--dry-run` to build it. |
169
+ | Preview a site | `wordcell serve --root site --port 8080` | Serves a published site on a loopback static file server with the emitted `404.html` fallback. |
128
170
 
129
171
  Use `--json` for structured output and `wordcell --help` for the complete command
130
172
  surface. [Full command reference](https://github.com/hraness/wordcell/blob/main/docs/reference.md#command-surface).
131
173
 
174
+ ## Publish a selected part of your vault
175
+
176
+ Preview the decision and plan from the example before writing an output folder:
177
+
178
+ ```sh
179
+ wordcell publish --root kb --out site \
180
+ --include notes/parser-contract --include plans/parser-v2 --dry-run --json
181
+ ```
182
+
183
+ Review the selection, then build and preview it:
184
+
185
+ ```sh
186
+ wordcell publish --root kb --out site \
187
+ --include notes/parser-contract --include plans/parser-v2
188
+ wordcell serve --root site --port 8080
189
+ ```
190
+
191
+ Open `http://127.0.0.1:8080`. You get readable pages, linked notes, and search
192
+ that runs in the browser. Upload the `site/` folder to your chosen static host
193
+ when you want to share it; `publish` itself never uploads anything.
194
+
195
+ For a repeatable slice, use path patterns or combine folders, tags, metadata,
196
+ code scopes, and linked neighborhoods:
197
+
198
+ ```sh
199
+ wordcell publish --root kb --out site-notes \
200
+ --include-glob 'notes/**/*.md' --exclude-glob '**/draft-*' --dry-run --json
201
+ ```
202
+
203
+ Preview reports show up to 20 selected IDs by default, with a total count and
204
+ selection digest. They keep note bodies out of the agent's context. Use
205
+ `--list-limit` to adjust that preview without changing what gets published. `publish: false` excludes a note, but selected
206
+ prose and attachments still need review before sharing: selection is not secret
207
+ redaction. [Selection recipes and hosting guide](https://github.com/hraness/wordcell/blob/main/docs/publish.md).
208
+
209
+ ## Evidence and comparisons
210
+
211
+ In a four-query example over a seven-note public vault, packed search snippets
212
+ used **80% fewer UTF-8 bytes** than passing the same matching notes in full:
213
+ 12,126 versus 60,584 bytes. This measures context payload size, not tokenizer
214
+ counts, answer quality, latency, or a win over another search tool.
215
+
216
+ In a separate public SciFact study, optional hosted Jev reranking placed a
217
+ judged relevant result first for **161 of 300 queries**, versus **101** with
218
+ Wordcell exact search alone. It sends bounded context to a paid provider;
219
+ this is evidence on scientific abstracts, not a comparison with QMD or a
220
+ guarantee for repository notes. [Results and limits](https://github.com/hraness/wordcell/blob/main/docs/reranking.md#evidence-and-limits).
221
+
222
+ Wordcell's benefit is selecting relevant context and keeping its sources
223
+ inspectable. Local ownership is also available in other tools, and Wordcell
224
+ does not claim to beat QMD's retrieval quality or every Markdown workflow.
225
+
226
+ [Measured evidence](https://github.com/hraness/wordcell/blob/main/docs/evidence.md)
227
+ shows a reproducible public-vault example, with the inputs, output sizes, and
228
+ limits beside each result. [The comparison guide](https://github.com/hraness/wordcell/blob/main/docs/comparisons.md)
229
+ covers Markdown alone, QMD, Basic Memory, Obsidian, and static publishing tools
230
+ using their own documentation. Choose the smallest workflow that meets your
231
+ needs.
232
+
132
233
  ## How the files fit together
133
234
 
134
235
  ```text
@@ -147,8 +248,11 @@ Markdown, YAML frontmatter, explicit wikilinks, and Git hold the record. Open
147
248
  the same files in Obsidian, a text editor, or ordinary file-search tools.
148
249
  Application code does not need to import Wordcell or its vault.
149
250
 
150
- QMD supplies optional local search. Oh supplies a disposable graph projection;
151
- only an explicit `wordcell graph rebuild --root kb` writes `.wordcell/oh.sqlite`.
251
+ QMD supplies optional local search. [Oh](https://oh.computer), the Hraness
252
+ record and memory kernel ([source](https://github.com/hraness/oh)), is embedded
253
+ as a derived graph authority behind an engine-neutral port: only an explicit
254
+ `wordcell graph rebuild --root kb` writes `.wordcell/oh.sqlite`, the file stays
255
+ ignored and rebuildable, and nothing flows from the projection back into notes.
152
256
  Backlinks and typed relationships come from authored links. Percolation
153
257
  suggests connections for review and does not add inferred edges to notes.
154
258
 
@@ -161,7 +265,7 @@ exist. [Graph queries and proof limits](https://github.com/hraness/wordcell/blob
161
265
  Add the same immutable release to a Bun project:
162
266
 
163
267
  ```sh
164
- bun add --exact --ignore-scripts https://github.com/hraness/wordcell/releases/download/v0.21.2/hraness-wordcell-0.21.2.tgz
268
+ bun add --exact --ignore-scripts https://github.com/hraness/wordcell/releases/download/v0.22.0/hraness-wordcell-0.22.0.tgz
165
269
  ```
166
270
 
167
271
  The SDK provides read-only vault sessions, metadata queries, search, graph
@@ -172,7 +276,9 @@ show the public imports and lifecycle.
172
276
  ## Privacy and boundaries
173
277
 
174
278
  - Structural queries and exact search read local files. Optional semantic
175
- search downloads its model on first use and runs locally.
279
+ search downloads its model on first use and runs locally. Optional Jev
280
+ reranking sends the query and bounded candidate context to a remote provider;
281
+ it is off by default.
176
282
  - URL capture contacts the requested source. Signed-in capture uses only
177
283
  explicitly selected browser state. Review the [security policy](https://github.com/hraness/wordcell/blob/main/SECURITY.md)
178
284
  before using it with private sources.
@@ -188,6 +294,7 @@ show the public imports and lifecycle.
188
294
  | [Agent workflow](https://github.com/hraness/wordcell/blob/main/docs/agent-workflow.md) | Set up, query, maintain, and revise repository memory. |
189
295
  | [Installation and command reference](https://github.com/hraness/wordcell/blob/main/docs/reference.md) | Exact interfaces, SDK imports, optional adapters, and troubleshooting prerequisites. |
190
296
  | [Web capture](https://github.com/hraness/wordcell/blob/main/docs/capture.md) and [PDF capture](https://github.com/hraness/wordcell/blob/main/docs/pdf.md) | Save sources with provenance, assets, and explicit completeness limits. |
297
+ | [Publish selected notes](https://github.com/hraness/wordcell/blob/main/docs/publish.md) | Preview a slice, build a static site, and choose how to host it. |
191
298
  | [Graph guide](https://github.com/hraness/wordcell/blob/main/docs/graph-authority.md) | Named queries, proofs, revisions, resource limits, and cache recovery. |
192
299
  | [Portfolio federation](https://github.com/hraness/wordcell/blob/main/docs/portfolio.md) | Search only selected, authorized vaults. |
193
300
  | [Design](https://github.com/hraness/wordcell/blob/main/docs/design.md) and [memory rationale](https://github.com/hraness/wordcell/blob/main/docs/agent-memory.md) | File contracts, design choices, and evaluation context. |
@@ -221,8 +328,10 @@ The same skill is included at `node_modules/@hraness/wordcell/skills/wordcell/`.
221
328
 
222
329
  ## Release notes
223
330
 
224
- Version 0.21 adds Oh graph queries and proofs. The deprecated `kb` command was
225
- removed at this boundary; use `wordcell`. Existing vaults need no migration.
331
+ Version 0.22 adds selective static publishing and local preview. Choose notes,
332
+ folders, path patterns, metadata, or linked neighborhoods, then inspect a
333
+ bounded selection report before building. Existing vaults need no migration.
334
+ The deprecated `kb` command was removed in 0.21.0; use `wordcell`.
226
335
  [All release notes and upgrade instructions](https://github.com/hraness/wordcell/blob/main/CHANGELOG.md).
227
336
 
228
337
  ## Contributing
@@ -234,3 +343,24 @@ See [Contributing](https://github.com/hraness/wordcell/blob/main/CONTRIBUTING.md
234
343
  [Install Wordcell from GitHub Releases](https://github.com/hraness/wordcell/releases) ·
235
344
  [Wordcell source on GitHub](https://github.com/hraness/wordcell) ·
236
345
  [Wordcell overview](https://wordcell.io)
346
+
347
+ ## Optional development support
348
+
349
+ `wordcell support` shows optional development support for Wordcell. Features stay
350
+ free and no account is required. Accounts presents current terms; the person
351
+ confirms any payment in their browser. Wordcell has no product newsletter and
352
+ does not look up an email address for support.
353
+
354
+ After useful standalone work, agents can receive a discovery record on stderr.
355
+ Read `wordcell support protocol --json` for the shared closeout procedure.
356
+ Help, diagnostics, evaluation, SDK calls and nested commands stay quiet.
357
+ `HRANESS_SUPPORT=off` or `HRANESS_SUPPORT_AUDIENCE=off` suppresses incidental
358
+ invitations. Explicit human terminal rendering requires
359
+ `HRANESS_SUPPORT_AUDIENCE=human`; the default audience is an agent, including in
360
+ a pseudo-terminal.
361
+
362
+ `wordcell support dismiss` disables invitations across participating tools on
363
+ this machine. `snooze` pauses them for thirty days, `enable` restores them, and
364
+ `status --json` shows their separate local preferences. These commands do not
365
+ change a vault, sign up or pay. Acknowledged invitations share a seven-day
366
+ cooldown; discovery itself does not consume it.
@@ -22,12 +22,49 @@ import {
22
22
  createOhProjectionDatasetV1,
23
23
  createOhProjectionFactV1,
24
24
  createOhProjectionSnapshotV1,
25
- evaluateOhProjectionV1,
26
25
  parseOhProjectionResultV1
27
26
  } from "@hraness/oh/projection";
28
27
  import { createOhSqliteStoreAuthorityV1 } from "@hraness/oh/sqlite";
29
28
  import { createOhStoreProfileV1, OH_WORKING_STORE_PROFILE_V1 } from "@hraness/oh/store";
30
29
 
30
+ // src/oh/projection-rust.ts
31
+ import { evaluateOhProjectionV1 } from "@hraness/oh/projection";
32
+ import { emitOhRustFallback } from "@hraness/oh/rust-fallback";
33
+ var cached;
34
+ function emitProjectionRustFallback(reason) {
35
+ emitOhRustFallback({ tag: "oh-projection-rust-fallback", reason });
36
+ }
37
+ var OH_PROJECTION_RUST_MODULE = "@hraness/oh/projection/rust";
38
+ async function loadEngine() {
39
+ if (cached !== undefined)
40
+ return cached;
41
+ try {
42
+ const module = await import(OH_PROJECTION_RUST_MODULE);
43
+ if (typeof module.loadProjectionRustEngineV1 !== "function") {
44
+ cached = null;
45
+ return null;
46
+ }
47
+ cached = await module.loadProjectionRustEngineV1();
48
+ } catch {
49
+ emitProjectionRustFallback("load-failed");
50
+ cached = null;
51
+ }
52
+ return cached;
53
+ }
54
+ async function loadProjectionRustEngineV1() {
55
+ return loadEngine();
56
+ }
57
+ function evaluateOhProjectionWithFallbackV1(input) {
58
+ if (input.engine !== null) {
59
+ try {
60
+ return input.engine.evaluate(input);
61
+ } catch {
62
+ emitProjectionRustFallback("evaluate-failed");
63
+ }
64
+ }
65
+ return evaluateOhProjectionV1(input);
66
+ }
67
+
31
68
  // src/oh/programs.ts
32
69
  import {
33
70
  createOhProjectionLiteralV1 as literal,
@@ -531,6 +568,7 @@ async function openOhGraphAdapter(input, options = {}) {
531
568
  if (canonicalJson4(materialized.records) !== canonicalJson4(expected))
532
569
  throw new GraphAuthorityError("corrupt-cache", "Graph reconciliation did not retain exact source records.");
533
570
  const projectionSnapshot = createOhProjectionSnapshotV1({ ...materialized, spaceId });
571
+ const rustEngine = await loadProjectionRustEngineV1();
534
572
  const recordMap = new Map(records.map((record, index) => [record.key, { record, source: snapshot.records[index] }]));
535
573
  const assertOpen = () => {
536
574
  if (closed)
@@ -561,15 +599,22 @@ async function openOhGraphAdapter(input, options = {}) {
561
599
  });
562
600
  try {
563
601
  const dataset = createOhProjectionDatasetV1({ extractorSha256: GRAPH_EXTRACTOR_SHA256, factPackId: "wordcell.graph-facts", factPackRevision: 1, facts, snapshot: projectionSnapshot });
564
- const result = evaluateOhProjectionV1({ ...program, dataset, snapshot: projectionSnapshot, options: {
565
- maximumDerivedTuples: limits.derivedTuples,
566
- maximumRounds: limits.rounds,
567
- maximumWorkUnits: limits.workUnits,
568
- maximumProofDepth: limits.proofDepth,
569
- maximumProofNodes: limits.proofNodes,
570
- maximumTotalProofNodes: limits.totalProofNodes,
571
- maximumResultBytes: limits.resultBytes
572
- } });
602
+ const result = evaluateOhProjectionWithFallbackV1({
603
+ dataset,
604
+ engine: rustEngine,
605
+ rulePack: program.rulePack,
606
+ query: program.query,
607
+ snapshot: projectionSnapshot,
608
+ options: {
609
+ maximumDerivedTuples: limits.derivedTuples,
610
+ maximumRounds: limits.rounds,
611
+ maximumWorkUnits: limits.workUnits,
612
+ maximumProofDepth: limits.proofDepth,
613
+ maximumProofNodes: limits.proofNodes,
614
+ maximumTotalProofNodes: limits.totalProofNodes,
615
+ maximumResultBytes: limits.resultBytes
616
+ }
617
+ });
573
618
  if (parseOhProjectionResultV1(result, result.identity.projectionSha256) === null)
574
619
  throw new GraphAuthorityError("corrupt-cache", "Oh returned an invalid bounded projection result.");
575
620
  await assertCurrent();
package/dist/benchmark.js CHANGED
@@ -4,11 +4,11 @@ import {
4
4
  createSyntheticRankFusionFixture,
5
5
  evaluateRanking,
6
6
  evaluateRetrievalBenchmark
7
- } from "./index-3ehtt59c.js";
8
- import"./index-why54q5p.js";
7
+ } from "./index-qwgsmtsz.js";
8
+ import"./index-gm9t95d9.js";
9
+ import"./index-d13v9ckt.js";
9
10
  import"./index-48pz4jpc.js";
10
11
  import"./index-06c9ctr6.js";
11
- import"./index-d13v9ckt.js";
12
12
  import"./index-5vwpzb5a.js";
13
13
  import"./index-ekpwvbra.js";
14
14
  import"./index-z1w83f81.js";
package/dist/capture.js CHANGED
@@ -5,16 +5,18 @@ import {
5
5
  captureSummary,
6
6
  main,
7
7
  runCapture
8
- } from "./index-180zbkkt.js";
8
+ } from "./index-de2w8crk.js";
9
9
  import"./index-6jcz0m1c.js";
10
10
  import"./index-f984hw45.js";
11
11
  import {
12
12
  adapterCapabilities,
13
13
  inspectClipEnvironment,
14
14
  renderDoctorReport
15
- } from "./index-by0pbant.js";
16
- import"./index-x6m57nfc.js";
15
+ } from "./index-fc4dr114.js";
16
+ import"./index-5n05se68.js";
17
+ import"./index-g5vsqmdy.js";
17
18
  import"./index-hgve9rh2.js";
19
+ import"./index-2gv8y733.js";
18
20
  import"./index-w2zc0vwa.js";
19
21
  import"./index-e5fbsywq.js";
20
22
  import {
@@ -22,9 +24,8 @@ import {
22
24
  } from "./index-dfag79p7.js";
23
25
  import"./index-gh719d91.js";
24
26
  import"./index-mxxxytys.js";
25
- import"./index-2gv8y733.js";
26
27
  import"./index-1xxnjn0d.js";
27
- import"./index-5n05se68.js";
28
+ import"./index-4knsp9qj.js";
28
29
  import"./index-z1w83f81.js";
29
30
 
30
31
  // src/capture.ts